home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / SAT / HeartQuest sample ƒ / sFlypaper.p < prev    next >
Encoding:
Text File  |  1993-09-19  |  3.8 KB  |  154 lines  |  [TEXT/PJMM]

  1. {===============================================}
  2. {================= Flypaper sprite unit ================}
  3. {===============================================}
  4.  
  5. { Example file for Ingemars Sprite Animation Toolkit. }
  6. { © Ingemar Ragnemalm 1992 }
  7. { See doc files for legal terms for using this code. }
  8.  
  9. unit sFlypaper;
  10.  
  11. { Sprite unit. A sprite unit should include the following routines:}
  12. { Init-procedure, that initializes private bitmaps}
  13. { Setup-procedure, that sets variables other than the standard ones set by MakeSprite }
  14. { Handle-procedure, to be called once per iteration until the sprite dies }
  15. { Hittask-procedure (optional), for advanced collission handling. }
  16.  
  17. { Flypaper object, the "enemies" in the HeartQuest game. }
  18.  
  19. interface
  20.  
  21.     uses
  22.         SAT, scores, SoundConst, GameGlobals;
  23.  
  24.     var
  25.         slowcount: integer;
  26.  
  27.     procedure InitFlypaper;
  28.     procedure SetupFlypaper (mp: SpritePtr);
  29.     procedure HandleFlypaper (me: SpritePtr);
  30.     procedure HandleDyingFlypaper (me: SpritePtr); {Behöver inte vara extern}
  31.  
  32. implementation
  33.  
  34.     var
  35.         FlypaperFace: array[1..6] of FacePtr; {förr 3}
  36.         DyingFlypaperFace: array[1..3] of FacePtr;
  37.  
  38.     procedure InitFlypaper;
  39.         var
  40.             ii: integer;
  41.             h: Handle;
  42.     begin
  43.         for ii := 1 to 6 do {förr 3}
  44.             FlypaperFace[ii] := GetFace(156 + ii);{132}
  45.         for ii := 1 to 3 do
  46.             DyingFlypaperFace[ii] := GetFace(143 + ii);
  47.     end;
  48.  
  49.     procedure SetupFlypaper (mp: SpritePtr);
  50.     begin
  51.         mp^.face := FlypaperFace[1];
  52.         mp^.mode := rand(3) + 1; { ikonnummer }
  53.         SetRect(mp^.hotRect, -14 + 16, -28 + 32, 14 + 16, 0 + 32);
  54.     end;
  55.  
  56.     procedure HandleFlypaper (me: SpritePtr);
  57.         var
  58.             mp: Spriteptr;
  59.             divmed: integer;
  60.     begin
  61.         if me^.kind <> -3 then
  62.             begin
  63.                 me^.kind := -3;
  64.                 if slowcount < 10 then
  65.                     begin
  66.                         slowcount := 50;
  67.                         SATSoundPlay(Splatt2SndH, 1, true);
  68.                         me^.task := @HandleDyingFlypaper; {Tag bort krockat papper!}
  69.                         me^.kind := 0;
  70.                     end;
  71. {me^.speed.h := rand(31) - 15;}
  72. {me^.speed.v := rand(31) - 15;}
  73.             end;
  74.  
  75.         me^.mode := me^.mode + 1;
  76.         if me^.mode = 7 then {förr 4}
  77.             me^.mode := 1;
  78.         me^.face := FlypaperFace[me^.mode];
  79.  
  80.         me^.position.h := me^.position.h + me^.speed.h;
  81.         me^.position.v := me^.position.v + me^.speed.v;
  82.  
  83.         if Rand100 < 7 then
  84.             me^.speed.h := rand(15) - 8;
  85.         if Rand100 < 4 then
  86.             me^.speed.v := rand(7) - 4;
  87.  
  88.         if (level > 4) then
  89.             if rand100 < level then
  90.                 if slowcount = 0 then
  91.                     begin
  92.                         me^.speed.h := PlayerPos.h - me^.position.h;
  93.                         me^.speed.v := PlayerPos.v - me^.position.v;
  94.                         divmed := abs(me^.speed.h) + abs(me^.speed.v);
  95.                         if divmed > level then
  96.                             begin
  97.                                 me^.speed.h := me^.speed.h * 2 * level div divmed;
  98.                                 me^.speed.v := me^.speed.v * 2 * level div divmed;
  99.                             end;
  100.                     end
  101.                 else {Spelaren stunnad - stick!}
  102.                     begin
  103.                         me^.speed.h := -(PlayerPos.h - me^.position.h);
  104.                         me^.speed.v := -(PlayerPos.v - me^.position.v);
  105.                         divmed := abs(me^.speed.h) + abs(me^.speed.v);
  106.                         if divmed > level then
  107.                             begin
  108.                                 me^.speed.h := me^.speed.h * 2 * level div divmed;
  109.                                 me^.speed.v := me^.speed.v * 2 * level div divmed;
  110.                             end;
  111.                     end;
  112.  
  113.         if me^.position.h < 0 then
  114.             begin
  115.                 me^.position.h := 0;
  116.                 me^.speed.h := 1;
  117.             end;
  118.         if me^.position.h > offSizeH - xsize then
  119.             begin
  120.                 me^.position.h := offSizeH - xsize;
  121.                 me^.speed.h := -1;
  122.             end;
  123.         if me^.position.v < 0 then
  124.             begin
  125.                 me^.position.v := 0;
  126.                 me^.speed.v := 1;
  127.             end;
  128.         if me^.position.v > offSizeV - 32 then
  129.             begin
  130.                 me^.position.v := offSizeV - 32;
  131.                 me^.speed.v := -1;
  132.             end;
  133.     end;
  134.  
  135.     procedure HandleDyingFlypaper (me: SpritePtr);
  136.         var
  137.             mp: Spriteptr;
  138.             divmed: integer;
  139.     begin
  140.         if me^.kind <> 0 then
  141.             me^.kind := 0;
  142.  
  143.         me^.mode := me^.mode + 1;
  144.         if me^.mode >= 4 then
  145.             me^.mode := 1;
  146.         me^.face := DyingFlypaperFace[me^.mode];
  147.  
  148.         me^.position.v := me^.position.v + 8;
  149.  
  150.         if me^.position.h > offSizeH then
  151.             me^.task := nil;
  152.     end;
  153.  
  154. end.